/* 
 * AgenteBusiness.java
 * 
 * Data de criação: 25/10/2010
 * 
 * CORPORATIVO - MTE. 
 *
 */
package br.com.o2solutions.siso.business;

import br.com.o2solutions.core.business.BasicBusiness;
import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.siso.integration.entidade.Agente;

/**
 * Interface para as definições dos métodos negociais relacionados ao objeto de
 * domínio {@link Agente}.
 * 
 * @author Osvaldeir
 * @since 25/10/2010
 * 
 */
public interface AgenteBusiness extends BasicBusiness<Agente> {

	/**
	 * Verifica a existência do {@link Agente} na base de dados e, caso não
	 * exista, lança uma {@link BusinessException} com a chave
	 * <b>error.agente.null</b> e a mensagem descritiva da exceção. Caso o
	 * agente passado como parametro seja nulo nada é realizado.
	 * 
	 * @param agente
	 *            Agente a ser verificado quanto a existência
	 * @throws BusinessException
	 *             Caso o agente não exista ou outra regra negocial seja
	 *             quebrada.
	 */
	public void verificarExistenciaAgente(Agente agente)
			throws BusinessException;

	/**
	 * {@inheritDoc} Ao se cadastrar o agente é necessário que seja verificado:
	 * <ul>
	 * <li>Se o agente possui no mínimo uma forma de contato. (RN AG01). Caso
	 * não seja informado o sistema deve lançar uma BusinessException com a
	 * chave <b>error.required.field</b> informando a necessidade de, no mínimo,
	 * uma forma de contato.</li>
	 * <li>Se o agente possui um endereço (RN AG03). Caso não seja informado o
	 * sistema deve lançar uma BusinessException com a chave
	 * <b>error.required.field</b> informando que o preenchimento do endereço é
	 * obrigatório.</li>
	 * <li>Se a matricula informada para cadastro já está cadastrada (RN AG02).
	 * Caso não seja informado o sistema deve lançar uma BusinessException com a
	 * chave <b>error.matricula.exists</b> informando a existência da matrícula.
	 * </li>
	 * </ul>
	 */
	@Override
	public void save(Agente entity) throws BusinessException;

	/**
	 * {@inheritDoc} Somente Agentes que não estão vinculados como comandante de
	 * Unidades Operacionais podem ser removidos do sistema. A remoção deve ser
	 * de forma lógica. Caso este esteja como comandante de unidade deve ser
	 * lançada uma BusinessException com a chave
	 * <b>error.agente.comandante.unidade</b> informando que o agente é
	 * comandante de uma unidade e não pode ser removido.
	 */
	@Override
	public void remove(Agente entity) throws BusinessException;

}
